package config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MqConfig {
    public static final String ES_MQ_DEMO = "es_mq_demo";
    @Bean(name = "mqConnectionFactory")
    public CachingConnectionFactory connectionFactory() {
        return new CachingConnectionFactory("localhost");
    }

  /*  @Bean
    public CachingConnectionFactory connectionFactory() {
        return new CachingConnectionFactory("localhost");
    }
*/
    @Bean
    public RabbitAdmin amqpAdmin() {
        return new RabbitAdmin(connectionFactory());
    }

    @Bean
    public Queue myQueue() {
        return new Queue(ES_MQ_DEMO);
    }


    @Bean
    public Jackson2JsonMessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 因为RedisConfig与MqConfig这2个配置类中都有connectionFactory的bean方法，那么就会导致spring容器中有两个同名的（connectionFactory）
     *     的bean，一个是LettuceConnectionFactory类型，一个是CachingConnectionFactory
     *
     * 如果你像这样注入工厂对象给RabbitTemplate：RabbitTemplate template = new RabbitTemplate(connectionFactory())，那么就报模糊的异常
     * 解决办法2个：
     * 1. 配置工厂的bean注解的名字属性，指定一个不同的名字，利用Qualifier限定特定名字的bean，这样就把这个依赖作为参数才行，这样就可以添加Qualifier注解
     * 2.配置工厂直接使用不同的名字，这种方法简单，推荐。
     * @param connectionFactory
     * @return
     */
    @Bean
    public RabbitTemplate rabbitTemplate(@Qualifier("mqConnectionFactory") CachingConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        //设置发送消息的消息转换器
        template.setMessageConverter(messageConverter());
        return template;
    }

}
